package com.example.designhbwxz.book.factory;

import com.example.designhbwxz.book.service.AbstractRegisterLoginComponent;
import com.example.designhbwxz.book.service.RegisterLoginFuncInterface;
import com.example.designhbwxz.book.service.impl.RegisterLoginComponent;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 工厂方法
 *
 * @author shenzw
 * @date 2023/10/28
 */
public class RegisterLoginComponentFactory {

    private RegisterLoginComponentFactory() {
    }

    /**
     * 缓存 AbstractRegisterLoginComponent（左路），根据不同的登陆方式进行缓存
     */
    protected static final Map<String, AbstractRegisterLoginComponent> COMPONENT_MAP = new ConcurrentHashMap<>();

    /**
     * 缓存不同类型的实现类（右路），如 RegisterLoginByDefault，RegisterLoginByGitee...
     */
    public static Map<String, RegisterLoginFuncInterface> funcMap = new ConcurrentHashMap<>();

    public static AbstractRegisterLoginComponent getComponent(String type) {
        // 如果存在，直接返回（AbstractRegisterLoginComponent component = COMPONENT_MAP.get(type);）
        AbstractRegisterLoginComponent component = COMPONENT_MAP.computeIfPresent(type, (k, v) -> v);

        if (component == null) {
            // 并发情况下，汲取双重检查锁机制的设计，如果 componentMap 中没有，则进行创建
            synchronized (COMPONENT_MAP) {
                component = COMPONENT_MAP.computeIfPresent(type, (k, v) -> v);
                if (component == null) {
                    // 根据不同类型的实现类（右路），创建 RegisterLoginComponent 对象，并 put 到 map 中缓存起来，以备下次使用
                    component = new RegisterLoginComponent(funcMap.get(type));
                    COMPONENT_MAP.put(type, component);
                }
            }
        }
        return component;
    }
}
